Layer指定使用哪種 activation 有下列方式 (這邊皆以 "relu" 來做範例) :
(1) 指定函式名稱 'relu' (內建 預設)
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.models import Model
model = Sequential([
layers.Dense(10, activation="relu")
])
依照範例程式之指定函式名稱'relu',會經過以下函式:
keras.activations.get
-> keras.activations.deserialize
-> keras.saving.serialization_lib.deserialize_keras_object
-> keras.saving.serialization_lib.serialize_with_public_fn
-> keras.saving.serialization_lib._retrieve_class_or_fn
要注意的是,透過 keras.saving.serialization_lib.serialize_with_public_fn 將資訊包成 dict 字串,
字串內容為{'class_name': 'function', 'config': 'relu', 'module': 'keras.activations', 'registered_name': 'relu'}
,
並傳入 keras.saving.serialization_lib._retrieve_class_or_fn 並指定 obj_type = 'function'
,接著回傳 activation 物件。
(2) 指定類別名稱 'ReLU' (內建 預設)
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.models import Model
model = Sequential([
layers.Dense(10, activation="ReLU")
])
注意大小寫名稱。
依照範例程式之指定函式名稱'ReLU',會經過以下函式:
keras.activations.get
-> keras.activations.deserialize
-> keras.saving.serialization_lib.deserialize_keras_object
-> keras.saving.serialization_lib.serialize_with_public_class
-> keras.saving.serialization_lib._retrieve_class_or_fn
這邊是透過 keras.saving.serialization_lib.serialize_with_public_class 將資訊包成 dict 字串,
字串內容為{'class_name': 'ReLU', 'config': None, 'module': 'keras.layers', 'registered_name': None}
,
並傳入 keras.saving.serialization_lib._retrieve_class_or_fn 並指定 obj_type = 'class'
,接著回傳 activation 物件。
其實 指定 'relu' 和 'ReLU' 是一樣的。 只是一種是直接使用函式轉換,另一種是利用實作類別的call function來使用。
而 (1)(2) 此二種都會經由一個 mapping 來找出對應的activation物件。其mapping的內容如下:
class:
'ELU': keras.layers.activation.elu.ELU
'LeakyReLU': keras.layers.activation.leaky_relu.LeakyReLU
'PReLU': keras.layers.activation.prelu.PReLU
'ReLU': keras.layers.activation.relu.ReLU
'Softmax': keras.layers.activation.softmax.Softmax
'ThresholdedReLU': keras.layers.activation.thresholded_relu.ThresholdedReLU
function:
'elu' : keras.activations.elu
'linear' : keras.activations.linear
'exponential' : keras.activations.exponential
'gelu' : keras.activations.gelu
'hard_sigmoid' : keras.activations.hard_sigmoid
'leaky_relu' : keras.activations.leaky_relu
'mish' : keras.activations.mish
'relu' : keras.activations.relu
'selu' : keras.activations.selu
'sigmoid' : keras.activations.sigmoid
'silu' : keras.activations.silu
'softmax' : keras.activations.softmax
'softplus' : keras.activations.softplus
'softsign' : keras.activations.softsign
'swish' : keras.activations.swish
'tanh' : keras.activations.tanh
(3) 自定義類別
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.models import Model
class MyReLU(layers.Layer):
def __init__(self, max_value=None, negative_slope=0.0, threshold=0.0, **kwargs):
super().__init__(**kwargs)
self.DefinedFunction = layers.ReLU(max_value, negative_slope, threshold)
def call(self, inputs):
return self.DefinedFunction.call(inputs)
model = Sequential([
layers.Dense(10, activation= MyReLU(max_value=None, negative_slope=0.0, threshold=0.0) )
])
此範例展示自定義activation類別,必須繼承 keras.layers.Layer , 並實作 init 與 call 函式。 call函式會因為 父類別__call__的轉換而被呼叫。而此範例只是再利用內建的relu,目的為做簡單的自定義例子來展現必須實作之處。
所以如果要自定義activation類別,可以實作此call函式,將要轉換的公式至於此,並記得回傳透過公式轉換之結果。
(4) 直接使用內建類別
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.models import Model
model = Sequential([
layers.Dense(10, activation= layers.ReLU(max_value=None, negative_slope=0.0, threshold=0.0))
])
第四個範例直接使用內建類別,可以直接試試看,不再詳細敘述。
以上是幾種取得並設定activation的方式,紀錄於此。